#include <iostream>
#include <string>

/*
浅拷贝
    浅拷贝是指在拷贝构造函数中，仅复制对象的每个成员变量的值。如果某个成员是指针，浅拷贝会直接复制指针的地址，而不是指针所指向的对象。

浅拷贝通常在以下情况下使用：
    - 对象中的成员变量是基本类型（如 `int`, `double` 等），或者没有动态分配的资源。
    - 对象的生命周期相同，避免共享资源的生命周期不同导致的问题。

需要编写拷贝构造函数的原因
    使用 编译器提供的 
        拷贝构造函数 以及 赋值运算符    会将指针指向的空间也赋值过去

深拷贝  自己写
浅拷贝  使用 编译器提供的 
*/

using namespace std;

// 定义 stu 类
class stu
{
private:
    int val;  // 存储整数值
public:
    int * ptr;  // 指向整数的指针

public:
    // 默认构造函数，初始化 val 为 10
    stu() : val(10), ptr(nullptr) { }

    // 带参构造函数，初始化 val 为传入的值
    stu(int val) : val(val), ptr(nullptr) { }

public:
    // 成员函数：输出 val 和 ptr 指向的值
    void show()
    {
        cout << val << endl;  // 输出 val 的值
        if (ptr) {
            cout << *ptr << endl;  // 输出 ptr 所指向的整数的值
        } else {
            cout << "ptr is nullptr" << endl;  // 如果 ptr 为 nullptr，则输出提示
        }
    }
};

int main(int argc, char const *argv[])
{
    // 创建一个 stu 类型的对象 s1，使用带参构造函数初始化 val 为 10
    stu s1(10);
    
    // 动态分配内存给 ptr，并将其值初始化为 80
    s1.ptr = new int(80);

    // 默认赋值运算符重载：拷贝 s1 对象的内容给 s2（浅拷贝）
    stu s2 = s1;  // 此时 ptr 的值被浅拷贝，s2.ptr 会指向与 s1.ptr 相同的内存地址
    *s1.ptr = 90;  // 修改 s1.ptr 所指向的值为 90
    s2.show();  // 输出 s2 的值，s2.ptr 会显示与 s1.ptr 相同的值（90）

    // 默认拷贝构造函数：拷贝 s1 对象的内容给 s3（浅拷贝）
    stu s3(s1);
    s3.show();  // 输出 s3 的值，s3.ptr 会显示与 s1.ptr 相同的值（90）

    return 0;
}
